package com.community.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.community.pojo.Menu;
import com.community.pojo.Permission;
import com.community.pojo.Role;
import com.community.service.*;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOError;
import java.util.*;

/**
 * <p>
 * 菜单表 前端控制器
 * </p>
 *
 * @author TangHaoSong Fly ChenJie HeYuHang
 * @since 2024-05-15
 */
@CrossOrigin
@RestController
@RequestMapping("/community/menu")
public class MenuController {

    @Autowired
    private IMenuService menuService;

    @Autowired
    private IRoleService roleService;

    @Autowired
    private IOrdersService ordersService;

    @Autowired
    private IConsumerService consumerService;

    @Autowired
    private IProductService productService;

    /**
     * 2024年6月6日16:16:41 怕他们拉取项目弄混淆，安全起见，我将查询的WelCome里面所需要的数据放在MenuController内
     * 1.订单数量
     * 2.用户数量
     * 3.商品数量
     * 4.销售额
     *
     * @return
     */
    @RequestMapping("/getOrderQuantity")
    public Object getOrderQuantity() {
        return ordersService.list().size();
    }

    /**
     * 用户数量
     *
     * @return
     */
    @RequestMapping("/getConsumerQuantity")
    public Object getConsumerQuantity() {
        return consumerService.list().size();
    }

    /**
     * 商品数量
     *
     * @return
     */
    @RequestMapping("/getProductQuantity")
    public Object getProductQuantity() {
        return productService.list().size();
    }

    /**
     * 销售额
     *
     * @return
     */
    @RequestMapping("/getSale")
    public Object getSale() {
        return productService.getSale();
    }


    /**
     * 根据id删除
     *
     * @param id
     * @return
     */
    @RequestMapping("/handleDelete/{id}")
    public Object handleDelete(@PathVariable Integer id) {
        Menu menu = menuService.getById(id);
        if (menu != null) {
            menu.setIsDelete(1);
            menuService.updateById(menu);
        }
        return true;
    }

    /**
     * 根据id修改有的值
     *
     * @param menu
     * @return
     */
    @RequestMapping("/saveMenu")
    public Object getRoles(@RequestBody Menu menu) {
        boolean flag = menuService.update(menu, new QueryWrapper<Menu>().eq("id", menu.getId()));
        return flag;
    }

    /**
     * 根据id修改状态 status
     *
     * @return
     */
    @RequestMapping("/updateMenuStatus/{id}")
    public Object updateMenuStatus(@PathVariable Integer id) {

        Menu menu = menuService.getById(id);

        if (menu != null) {
            // 更新员工的状态
            // 切换状态，如果为0则 1-0=1 如果为 1 啧1-1=0
            menu.setStatus(1 - menu.getStatus());

            // 执行更新员工信息的操作
            menuService.updateById(menu);
        }
        return true;

    }

    /**
     * 2024年6月3日11:27:42：
     * 获取所有的菜单，包括权限，但是权限数据放在menus里面的Children集合当中，不然无法展示
     *
     * @return
     */
    @RequestMapping("/getMenusAll")
    public PageInfo<Menu> getMenusAll() {
        // 必须是未删除
        List<Menu> menuList = menuService.list(new QueryWrapper<Menu>().eq("is_delete", 0));

        // 分级别 目录 和菜单
        List<Menu> menuTree = buildMenuTree(menuList);

        // 创建 PageInfo 对象
        PageInfo<Menu> pageInfo = new PageInfo<>(menuTree);

        // 返回 PageInfo 对象
        return pageInfo;
    }


    /**
     * 获取所有菜单包括分级
     * 条件：1. is_delete 未删除
     *
     * @return
     */
    @RequestMapping("/getMenus")
    public List<Menu> getMenus() {

        // 获取Menu所有数据
        List<Menu> menuList = menuService.list(new QueryWrapper<Menu>().eq("is_delete", 0));

        // 构建菜单树形结构
        List<Menu> resultList = buildMenuTree(menuList);

        return resultList;
    }


    /**
     * 1.根据后台登录的角色主键id查询到对应的菜单
     *
     * @param employeeId
     * @return
     */
    @RequestMapping("/{employeeId}")
    public List<Menu> getMenuList(@PathVariable Integer employeeId) {
        // 使用 Set 存储唯一的菜单
        Set<Menu> menuSet = new HashSet<>();

        // 根据员工id查询所对应角色
        List<Role> roles = roleService.getRoleByEmployeeId(employeeId);

        // 根据所有角色查询对应菜单
        List<Menu> menus = menuService.getMenuListByRoles(roles);
        menuSet.addAll(menus);

        // 获取菜单对应的权限
        for (Menu menu : menuSet) {
            List<Permission> permissions = menuService.getPermissionsByMenu(menu);
            menu.setPermissions(permissions);
        }

        // 转换为 List 并根据 sequence 字段排序
        List<Menu> menuList = new ArrayList<>(menuSet);
        Collections.sort(menuList, Comparator.comparing(Menu::getSequence));

        // 构建菜单树形结构
        List<Menu> menuTree = buildMenuTree(menuList);
        return menuTree;
    }

    private List<Menu> buildMenuTree(List<Menu> menus) {
        List<Menu> menuTree = new ArrayList<>();

        for (Menu menu : menus) {
            if (menu.getParentId() == null) {
                List<Menu> children = buildSubMenu(menu.getId(), menus);
                menu.setChildren(buildSubMenu(menu.getId(), menus));
                menuTree.add(menu);
            }
        }

        return menuTree;
    }

    private List<Menu> buildSubMenu(Integer parentId, List<Menu> menus) {
        List<Menu> subMenus = new ArrayList<>();

        for (Menu menu : menus) {
            // 当前id不为空  并且 当前id等于他的父级id
            if (menu.getParentId() != null && menu.getParentId().equals(parentId)) {
                menu.setChildren(buildSubMenu(menu.getId(), menus));
                subMenus.add(menu);
            }
        }
        return subMenus;
    }


    // 构建菜单树的递归函数
    private List<Menu> buildMenuTree1(List<Menu> menuList) {
        Map<Integer, Menu> menuMap = new HashMap<>();
        List<Menu> roots = new ArrayList<>();

        // 构建菜单节点映射
        for (Menu menu : menuList) {
            menuMap.put(menu.getId(), menu);
        }

        // 遍历菜单列表，构建菜单树
        for (Menu menu : menuList) {
            Integer parentId = menu.getParentId();
            if (parentId == null) {
                roots.add(menu);
            } else {
                Menu parentMenu = menuMap.get(parentId);
                if (parentMenu != null) {
                    if (parentMenu.getChildren() == null) {
                        parentMenu.setChildren(new ArrayList<>());
                    }
                    parentMenu.getChildren().add(menu);
                }
            }
        }

        return roots;
    }
}
